home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AmigActive 22
/
AACD 22.iso
/
AACD
/
Resources
/
Sound
/
AHI
/
Developer
/
examples
/
Low-level
/
3rd party
/
GetAudioID
/
Source
/
GAI.S
< prev
Wrap
Text File
|
1996-05-01
|
12KB
|
573 lines
*************************************************
* *
* (C) Copyright 1996 *
* *
* Tomi Blinnikka *
* *
*************************************************
* *
* DISTRIBUTION: *
* *
* The complete and unmodified archive, as *
* provided by Tomi Blinnikka, may be freely *
* redistributed via any means which preserves *
* its copyrights. The archive may not be sold *
* for profit. *
* *
* Permission granted to be distributed with the *
* AHI user/development software. *
* *
*************************************************
* *
* DISCLAIMER: *
* *
* GETAUDIOID IS PROVIDED "AS-IS" AND SUBJECT TO *
* CHANGE; NO WARRANTIES ARE MADE. ALL USE IS *
* AT YOUR OWN RISK. NO LIABILITY OR *
* RESPONSIBILITY IS ASSUMED. *
* *
*************************************************
* *
* DESCRIPTION: *
* *
* A program to display AHI AudioID requester *
* and print selected ID in hex and decimal. *
* *
* Requires Kickstart 2.04+, ahi.device 1+. *
* *
*************************************************
* *
* HISTORY: *
* *
* Version 0.01 29.04.1996 *
* -0.99ö 29.04.1996 *
* *
* Basics. *
* *
* *
* Version 1.00 30.04.1996 *
* *
* Works from CLI/Shell & Workbench. *
* *
* Added TITLE, POSITIVE, NEGATIVE, LFORMAT & *
* PUBSCREEN options. *
* *
* Added Locale support. *
* *
* *
* Version 1.01 01.05.1996 *
* *
* Doesn't set an initial AudioID anymore, *
* since Martin tells my shouldn't make *
* assumptions about direct IDs. *
* *
* Recompiled with tags names from AHI beta 2. *
* *
* If no mode was selected then returns -5. *
* *
* *
* BUGS: *
* *
* *
*************************************************
INCLUDE "dos/dosextens.i"
INCLUDE "devices/ahi.i"
INCLUDE "libraries/locale.i"
INCLUDE "workbench/startup.i"
INCLUDE "JMPLibs.i" ;Macros to open/close/call libs
INCLUDE "lvo/ahi_lib.i" ;ahi.device offsets
;XREFs needed
INCLUDE "XREF:2.0.xref"
INCLUDE "XREF:exec.xref"
INCLUDE "XREF:dos.xref"
INCLUDE "XREF:icon.xref"
;DEBUG_MODE SET 1
AHI_DEFMIXFREQ: EQU 30058 ;Sounds a lot better than 11kHz...
PROGVERSION: macro
dc.b "1.01 (01.05.96)"
endm
;Use these and leave a few hundred include lines out
TRUE: EQU 1
FALSE: EQU 0
do_ToolTypes: EQU $36
Section GAI,CODE
START: push all ;Save registers
sub.l a1,a1 ;Find our task
jlib Exec,FindTask
move.l d0,a4
move.l pr_CLI(a4),d0
bne OpenDos
lea.l pr_MsgPort(a4),a0
jlib Exec,WaitPort
lea.l pr_MsgPort(a4),a0
flib Exec,GetMsg ;Get WB message
move.l d0,WBMsg
OpenDos: openlib Dos,NoDos ;Keep at beginning
moveq.l #0,d1 ;Go to root
jlib Dos,CurrentDir
move.l d0,OrigLock ;This is where we came from
;Open locale.library
openlib Locale,NoLocale
sub.l a0,a0
jlib Locale,OpenLocale
move.l d0,Locale1
sub.l a0,a0 ;No locale, use default
lea.l CatalogName1,a1
lea.l CatalogTags,a2
jlib Locale,OpenCatalogA ;Open our catalog for this language
move.l d0,GAICatalog
beq NoLocale
;Here we set the text strings using locale support
moveq.l #0,d7
lea.l CatStrings,a3 ;Def. String in A1
LocaleLoop: move.l d7,d0 ;StringNum in D0
move.l GAICatalog,a0 ;Catalog in A0
move.l (a3),a1 ;Default string in A1
jlib Locale,GetCatalogStr
move.l d0,(a3)
add.l #1,d7
add.l #4,a3
cmp.l #CatStrAmount,d7
bne LocaleLoop
;Fix strings that aren't move.l'd
NoLocale: move.l STRAHIReqTitle1,OptTitle
move.l STRPositiveText2,OptPositive
move.l STRNegativeText2,OptNegative
tst.l WBMsg
beq CLIStart ;Skip WB stuff if from CLI
;Open CON: window where we print errors and the result.
move.l #CONName,d1
move.l #MODE_OLDFILE,d2
jlib Dos,Open
move.l d0,CONFile
beq ShutDown
move.l CONFile,_stdout
openlib Icon,NoIcon
move.l WBMsg,a0
move.l sm_ArgList(a0),a1
move.l wa_Lock(a1),d1
jlib Dos,CurrentDir ;Change to the directory where our icon is
;The icon we open here can't be free'd until all the data from them has
;been dealt with, i.e. until the progrma ends.
move.l WBMsg,a0
move.l sm_ArgList(a0),a1
move.l wa_Name(a1),a0
jlib Icon,GetDiskObject ;Get icon
move.l d0,DiskObject
beq MainStart
DoToolType1: move.l d0,a4
move.l do_ToolTypes(a4),a0
lea.l DECIMALText1,a1
flib Icon,FindToolType
tst.l d0
beq DoToolType2
move.l #1,OptDecimal ;This user wants decimal ID
DoToolType2: move.l do_ToolTypes(a4),a0
lea.l TITLEText1,a1
flib Icon,FindToolType
tst.l d0
beq DoToolType3
move.l d0,OptTitle ;This title, please
DoToolType3: move.l do_ToolTypes(a4),a0
lea.l POSITIVEText1,a1
flib Icon,FindToolType
tst.l d0
beq DoToolType4
move.l d0,OptPositive ;This positive gad text
DoToolType4: move.l do_ToolTypes(a4),a0
lea.l NEGATIVEText1,a1
flib Icon,FindToolType
tst.l d0
beq DoToolType5
move.l d0,OptNegative ;This negative gad text
DoToolType5: move.l do_ToolTypes(a4),a0
lea.l LFORMATText1,a1
flib Icon,FindToolType
tst.l d0
beq DoToolType6
move.l d0,OptLFormat ;Format with this
DoToolType6: move.l do_ToolTypes(a4),a0
lea.l PUBSCREENText1,a1
flib Icon,FindToolType
tst.l d0
beq DoToolType7
move.l d0,OptPubScreen ;Open on this public screen
DoToolType7:
bra MainStart ;Skip CLI stuff
CLIStart: jlib Dos,Output
move.l d0,_stdout
move.l #CLTemplate1,d1
move.l #CLArray1,d2
moveq.l #0,d3
flib Dos,ReadArgs ;Read options from CLI
move.l d0,RDArgs1
beq NoRDArgs
;Open ahi.device
MainStart: OPENAHI 1
move.l d0,_AHIBase
beq NoAHI ;Open failed
;Let's set all the options correctly
move.l (OptTitle),ReqTitle
move.l (OptPositive),ReqPos
move.l (OptNegative),ReqNeg
move.l (OptPubScreen),ReqPubScr
;Here we go and check that the user specified formatting string doesn't
;contain more than two '%ld' strings.
move.l OptLFormat,d2
beq OpenAHIReq ;Check if available
bsr CheckLegality ;Check if valid
tst.l d2
beq BadFmt ;ERROR: Invalid
;Allocate AHI's audio requester
OpenAHIReq: lea.l AHIReqTags1,a0
jlib AHI,AHI_AllocAudioRequestA
move.l d0,AHIReq1
beq NoAHIReq ;Allocation failed
;Show requester
move.l d0,a0
lea.l AHIReqTags2,a1
flib AHI,AHI_AudioRequestA
cmp.l #TRUE,d0
bne CheckCancel ;Positive gad _not_ pressed
;Get values from requester and set then into the formatting template
move.l AHIReq1,a0
cmp.l #AHI_INVALID_ID,ahiam_AudioID(a0)
beq CheckCancel ;None selected
lea.l VFPrintfArgv,a1
move.l ahiam_AudioID(a0),0(a1)
move.l ahiam_MixFreq(a0),4(a1)
move.l #FmtString1,d2 ;Default formatting string
tst.l OptDecimal ;Test for user's FmtString
beq CLIOpts2
move.l #FmtString2,d2 ;Print audio ID in decimal
CLIOpts2: tst.l OptLFormat
beq PrintResult
move.l OptLFormat,d2 ;Print audio ID in hex
PrintResult: move.l _stdout,d1
move.l a1,d3
jlib Dos,VFPrintf ;Print chosen mode
tst.l OptLFormat
beq ShutDown
lea.l CRLFText1,a0
bsr Printer ;The user string needs a CRLF pair
bra ShutDown
;ShutDown routine. This cleans up EVERYTHING.
;
;We have three ways to start it:
;
;1. ERRShutDown - does a quick turn in Printer to print anything in a0 first
;2. ERRShutDown2 - makes sure we return an error code when finished
;3. ShutDown - a normal or non-fatal shutdown
ERRShutDown: bsr Printer
ERRShutDown2: move.l #RETURN_FAIL,RetCode
ShutDown: tst.l _AHIBase
beq ShutDown7000
move.l AHIReq1,a0 ;Allowed to be NULL
jlib AHI,AHI_FreeAudioRequest
ShutDown7000: tst.l CONFile
beq ShutDown6000
move.l CONFile,d1
jlib Dos,Close
ShutDown6000: move.l RDArgs1,d1
beq ShutDown5000
jlib Dos,FreeArgs
ShutDown5000: tst.l _DosBase
beq ShutDown4000
move.l OrigLock,d1 ;Can be zero for root
jlib Dos,CurrentDir
ShutDown4000: tst.l DiskObject
beq ShutDown1500
move.l DiskObject,a0
jlib Icon,FreeDiskObject
ShutDown1500: tst.l _LocaleBase
beq ShutDown1000
move.l GAICatalog,a0
jlib Locale,CloseCatalog
ShutDown1000: CLOSEAHI
closlib Locale
closlib Icon
closlib Dos
move.l WBMsg,d2
beq ShutDown100
jlib Exec,Forbid
move.l d2,a1
flib Exec,ReplyMsg
ShutDown100: pull all
move.l RetCode,d0
rts
;Subroutines
;CheckLegality does a simple check on the user provided formatting string
;so that we hopefully can't cause any Enforcer hits or any other nasty
;things
;
;INPUTS D2 = Pointer to formatting string
;
;OUTPUT D2 = NULL for error or original string
CheckLegality: move.l d2,a0
clr.b d1 ;'%' counter
CheckLegality2: tst.b (a0)
beq CheckLeg_OUT ;Do until NULL
cmp.b #'%',(a0)+
bne CheckLegality2
cmp.b #'%',(a0) ;Let user print %-sign
bne CheckLegality3
add.l #1,a0
bra CheckLegality2
CheckLegality3: add.b #1,d1
cmp.b #3,d1
bne CheckLegality2 ;OK if 2 or under
CheckLegality4: clr.l d2 ;Illegal
CheckLeg_OUT: rts
;Error handling routines
NoDos: pull all
move.l #RETURN_FAIL,d0
rts
CheckCancel: move.l #RETURN_WARN,RetCode ;Set return code to WARN
NoRDArgs: jlib Dos,IoErr
move.l d0,d1
beq ShutDown ;User cancelled
moveq.l #0,d2
flib Dos,PrintFault
bra ERRShutDown2
NoAHI: move.l STRNoAHIText1,a0
bra ERRShutDown
NoIcon: move.l STRNoIconText1,a0
bra ERRShutDown
NoAHIReq: move.l STRNoAHIReqText1,a0
bra ERRShutDown
BadFmt: move.l STRBadFormatText1,a0
bra ERRShutDown
;Normal print function with Enforcer hit checks
Printer: cmp.l #0,a0
beq Printer_OUT ;No string
tst.b (a0)
beq Printer_OUT ;No content
move.l _stdout,d1
move.l a0,d2
jlib Dos,FPuts ;Print buffered
Printer_OUT: rts
;Reservations start here
libnames ;This contains macros for the library names
ds.l 0
;CLI/Shell stuff
RDArgs1: dc.l 0 ;CLI arguments
RetCode: dc.l RETURN_OK ;Return this on exit
;Options
CLArray1:
OptDecimal: dc.l 0 ;Print ID in decimal
OptTitle: dc.l 0 ;Window title
OptPositive: dc.l 0 ;Positive gad text 'OK'
OptNegative: dc.l 0 ;Negative gad text 'Cancel'
OptLFormat: dc.l 0 ;User defined formatting
OptPubScreen: dc.l NULLText1 ;Screen to open on
;File stuff
CONFile: dc.l 0 ;Actuall a CON window
_stdout: dc.l 0 ;CLI or 'CON:'
OrigLock: dc.l 0 ;Directory where we started
;Workbench stuff
WBMsg: dc.l 0 ;WB message
DiskObject: dc.l 0 ;Icon
;AHI stuff
_AHIBase: dc.l 0 ;AHI device base
AHIReq1: dc.l 0 ;AudioID requester
VFPrintfArgv: dc.l 0,0 ;AHIAudioID, AHIMixFreq
;Locale stuff
GAICatalog: dc.l 0 ;Our translation file
Locale1: dc.l 0 ;Locale we're using
;Text strings
CLTemplate1: dc.b "DEC=DECIMAL/S,TITLE/K,POSITIVE/K,NEGATIVE/K,"
dc.b "LFORMAT/K,PUBSCREEN/K",0
DECIMALText1: dc.b "DECIMAL",0
TITLEText1: dc.b "TITLE",0
POSITIVEText1: dc.b "POSITIVE",0
NEGATIVEText1: dc.b "NEGATIVE",0
LFORMATText1: dc.b "LFORMAT",0
PUBSCREENText1: dc.b "PUBSCREEN",0
CONName: dc.b "CON:0/10/500/70/GetAudioID/CLOSE/AUTO/WAIT",0
Version: dc.b "$VER: GetAudioID "
PROGVERSION
dc.b " (c) Copyright Tomi Blinnikka 1996",0
FmtString1: dc.b "AUDIOID=0x%08lx MIXFREQ=%ld\r\n",0
FmtString2: dc.b "AUDIOID=%ld MIXFREQ=%ld\r\n",0
CRLFText1: dc.b "\r\n" ;Continues on next line!
NULLText1: dc.b "",0
;Locale strings
EnglishText1: dc.b "english",0
CatalogName1: dc.b "GetAudioID.catalog",0
;Taglists
ds.l 0 ;Long align
;Tags for requester allocation
AHIReqTags1: dc.l AHIR_PubScreenName
ReqPubScr: dc.l 0
dc.l TAG_DONE
;Tags for showing requester
AHIReqTags2: dc.l AHIR_TitleText
ReqTitle: dc.l 0
dc.l AHIR_PositiveText
ReqPos: dc.l 0
dc.l AHIR_NegativeText
ReqNeg: dc.l 0
dc.l AHIR_DoMixFreq,TRUE ;Have slider for MixFrequency
dc.l AHIR_InitialMixFreq,AHI_DEFMIXFREQ ;Start with this MixFreq
dc.l TAG_DONE
;Locale tags
CatalogTags: dc.l OC_Language,0
dc.l OC_BuiltInLanguage,EnglishText1 ;We have this language built-in
dc.l TAG_DONE
;Locale text strings
INCDIR "LWF:AHI/GetAudioID/" ;Change to your path
INCLUDE "GAI_locale.i"
END